/*@author: Ana Rebollo Pin
 * 
 */
package com.bonshotels.DomainLayer.DomainModel;

import java.io.Serializable;

import com.bonshotels.DomainLayer.DomainModel.IEstrategiaCalculPreu;

/**
 * Classe DescompteFixe.
 * 
 * Aquesta clase implementa la operacio de Calcularpreu que s'ha
 * declarat a la interface EstartegiaCalculPreu.
 * Forma part de l'aplicacio del patro estrategia i es una de les
 * possibles estrategies aplicables pels hotels. 
 * Com que utilitzem el framework de persistencia
 * Hibernate i aquest utilitza reflexio per fer la seva feina les nostres classes han d'acomplir una
 * serie de propietats perque la reflexio del Hibernate pugui fer completament la seva feina, les
 * classes han de ser publiques, han de tenir un constructor public buit (si no en tenen un d'explicit
 * el per defecte ja ho es), han d'implementar Serializable, i han de tenir substituits (override) els
 * metodes equals() i hashCode() perque identifiquin les classes a partir de la seva clau natural.
 * Com que DescompteFixe s'identifica pel seu descompteFixe l'hem fet servir, a l'hora
 * d'implementar equals(), hashCode().
 * A diferencia del disseny de la entrega 3 la interficie IEstrategiaClaculPreu i les seves
 * realitzacions han passat a utilitzar una estrategia de mappeig del tipus Class Table Inheritance
 * utilitzant una taula per guardar tots els id de les realitzacions de IEstrategiaCalculPreu.
 * Els metodes getId i setId apareixen d'implementar els metodes creats a la interficie
 * IEstrategiaCalculPreu perque el Hibernate pugui assignar claus que no es solapin a totes
 * les instancies de classes que l'implementen.
 */

public class DescompteFixe implements IEstrategiaCalculPreu, Serializable {

	/** La constant serialVersionUID. */
	private static final long serialVersionUID = -86629259438644016L;

	/** La id. */
	private long id;
	
	/** descompte associat a aquest tipus de estrategia. */
    private float descompteFixe;
    
    /**
     * Aplica l'estrategia de descompte fixe al preu base que rep com
     * a parametre, que consisteix en restar el descompteFixe asignat
     * a aquesta estrategia del preu inicial.
     *
     * @param preu cost del tipus d'habitacio inicial sobre el que
     * s'aplica el descompte fixe
     * @return preu final un cop s'aplicat el descompte fixe.
     */
    public float calcularPreu(float preu) {
    	float preuFinal = preu - descompteFixe;
    	return preuFinal;
    }

	/**
	 * Getter de descompteFixe.
	 *
	 * @return El descompte fixe
	 */
	public float getDescompteFixe() {
		return descompteFixe;
	}

	/**
	 * Setter de descompte fixe.
	 *
	 * @param descompteFixe El nou descompte fixe
	 */
	public void setDescompteFixe(float descompteFixe) {
		this.descompteFixe = descompteFixe;
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.DomainModel.IEstrategiaCalculPreu#getId()
	 */
	@Override
	public long getId() {
		return id;
	}

	/* (non-Javadoc)
	 * @see com.bonshotels.DomainLayer.DomainModel.IEstrategiaCalculPreu#setId(long)
	 */
	@Override
	public void setId(long id) {
		this.id = id;		
	}
	
	/**
	 * Getter de serialversionuid.
	 *
	 * @return El serialversionuid
	 */
	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + Float.floatToIntBits(descompteFixe);
		return result;
	}

	/* (non-Javadoc)
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		DescompteFixe other = (DescompteFixe) obj;
		if (Float.floatToIntBits(descompteFixe) != Float
				.floatToIntBits(other.descompteFixe))
			return false;
		return true;
	}
	
}
